use std::array::from_mut;

pub(crate) fn slice_func() {
    let mut s = String::from("HELLO WORLD!");

    // let wordIndex = first_world(s);

    // s.clear();

    // println!("{}",wordIndex);

    // 字符串切片
    // 0..<5
    let hello = &s[0..5];
    // 6..<11
    let world = &s[6..11];

    let world_index = three_world(&s[..]);

    let my_world = "WORLD";
    let worldIndex = three_world(my_world);

    let a = [1,2,3,4];
    let slice = &a[1..3];
}

// 切片 但是s离开了作用域已经失效，所有返回s的索引位置是毫无意义
fn first_world(s: &String) -> usize {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return i;
        }
        s.len()
    }
}


fn two_world(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[..i];
        }
        &s[..]
    }
}

// 变量类型为&str，它时一个指向二进制程序特定位置的切片，&str是不可变引用，所以字符串字面值也是不可变的。
// 采用&str作为参数类型，因为这样可以同时接受String和&str类型的参数
// fn two_world(s:&String) -> &str {
// 使用字符串切片，直接调用函数；使用String，可以创建完整的String切片来调用函数。
// 定义函数时使用字符串切片引用会使我们的api更加通用，且不会损失任何功能。

fn three_world(s: &str) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[..i];
        }
        &s[..]
    }
}


